package com.study.listener;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.io.*;
import java.util.HashMap;

@WebListener
@Configuration
@Slf4j
public class ContextListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
        log.info("自定义监听器，只会在项目启动时初始化，也就是说只会执行一次 ");

        //例一：在服务启动时，将数据库中的数据加载进内存，并将其赋值给一个属性名，其它的 Servlet 就可以通过 getAttribute 进行属性值的访问。
        /*
        1、ServletContext 对象是一个为整个 web 应用提供共享的内存，任何请求都可以访问里面的内容

        2、如何实现在服务启动的时候就动态的加入到里面的内容：我们需要做的有：

        1 ） 实现 servletContextListerner 接口 并将要共享的通过 setAttribute （ name,data ）方法提交到内存中去   ；

        2 ）应用项目通过 getAttribute(name) 将数据取到 。
         */
        ServletContext servletContext = sce.getServletContext();

        HashMap<String, String> hashMap = new HashMap<String, String>();

        //read db
        hashMap.put("1001", "xiaoming");
        hashMap.put("1002", "xiaohong");

        // 将所取到的值存放到一个属性键值对中
        servletContext.setAttribute("userinfo", hashMap);

        //例二：书写一个类用于统计当Web 应用启动后，网页被客户端访问的次数。如果重新启动Web 应用，计数器不会重新从1 开始统计访问次数，而是从上次统计的结果上进行累加。
        /*
        1 、在 Web 应用启动时从文件中读取计数器的数值，并把表示计数器的 Counter 对象存放到 Web应用范围内。存放计数器的文件的路径为helloapp/count/count.txt 。

        2 、在Web 应用终止时把Web 应用范围内的计数器的数值保存到count.txt 文件中。
         */


        try {
            //绝对路径访问
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\logs\\count.txt"), "UTF-8"));

            int count = Integer.parseInt(bufferedReader.readLine());

            bufferedReader.close();

            // 把计数器对象保存到 Web 应用范围
            servletContext.setAttribute("count", count);
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    public void contextDestroyed(ServletContextEvent sce) {
        log.info("自定义监听器，只会在项目结束时执行，也就是说只会执行一次 ");
        // 获取 ServletContext 对象

        ServletContext context=sce.getServletContext();

        // 从 Web 应用范围获得计数器对象
        int count= (int) context.getAttribute("count");


        PrintWriter printWriter = null;
        try {
            printWriter = new PrintWriter("D:\\logs\\count.txt");

            printWriter.println(count +1);

            printWriter.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}
